#include "ArchivoAuxiliar.h"

ArchivoAuxiliar::ArchivoAuxiliar(const char* filename):Archivo(filename) {
	this->filename = filename;
}

void ArchivoAuxiliar::write(RegistroAuxiliar& r) {
	unsigned short int numBytes;
	numBytes = r.getTermino().length();

	unsigned short int numDocs;
	numDocs = r.getNroDocs()->size();

	char* termino = new char[numBytes + 1];
	strcpy(termino, r.getTermino().c_str());

	uint32_t* nroDocs = new uint32_t[r.getNroDocs()->size()];

	for (unsigned int i = 0; i < r.getNroDocs()->size(); i++)
		nroDocs[i] = r.getNroDocs()->at(i);

	uint16_t* frecuencias = new uint16_t[r.getFrecuencias()->size()];

	for (unsigned int j = 0; j < r.getFrecuencias()->size(); j++)
		frecuencias[j] = r.getFrecuencias()->at(j);

	Archivo::write((char*) &numBytes, sizeof(unsigned short int));
	Archivo::write((char*) &numDocs, sizeof(unsigned short int));

	Archivo::write((char*) termino, numBytes);
	Archivo::write((char*) nroDocs, r.getNroDocs()->size() * sizeof(uint32_t));
	Archivo::write((char*) frecuencias, r.getFrecuencias()->size() * sizeof(uint16_t));

}

int ArchivoAuxiliar::read(RegistroAuxiliar* r) {
	unsigned int pos = this->tellg();
	this->clear();
	this->seekg(0, ios::end);
	unsigned int length = this->tellg();

	if (pos == length)
		return RES_EOF;

	this->clear();
	this->seekg(pos, ios::beg);

	unsigned short int numBytes;
	Archivo::read((char*) &numBytes, sizeof(unsigned short int));

	unsigned short int numDocs;
	Archivo::read((char*) &numDocs, sizeof(unsigned short int));

	char* termino = new char[numBytes + 1];
	Archivo::read((char*)termino, numBytes);
	termino[numBytes] = '\0';

	r->setTermino(string(termino));

	uint32_t* nroDocs = new uint32_t[numDocs];
	Archivo::read((char*)nroDocs, numDocs * sizeof(uint32_t));

	for (unsigned int i = 0; i < numDocs; i++) {
		r->agregarDocumento((uint32_t)nroDocs[i]);
	}

	uint16_t* frecuencias = new uint16_t[numDocs];
	Archivo::read((char*)frecuencias, numDocs * sizeof(uint16_t));

	for (unsigned int j = 0; j < numDocs; j++) {
		r->agregarFrecuencia((uint16_t)frecuencias[j]);
	}

	return RES_OK;
}

void ArchivoAuxiliar::destroy() {
	remove(this->filename);
}

ArchivoAuxiliar::~ArchivoAuxiliar() {
	this->close();
}
